package service.interf;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;
import dao.pojo.BasePojo;

/**
 * 基础数据业务接口
 * 
 * @author fieldyang
 * @since 2012-06-24
 * @version 1.0
 */
public interface IBaseDataService {
	/**
	 * 获取查询结果字符串
	 * 
	 * @param entityName
	 *            实体名(和dao.pojo中定义一样，包含大小写)
	 * @param fieldStr
	 *            要查询的字段,以“,”分隔,基于外键的关系,用对象方式,如company.companyName,
	 *            如果查询所有常规(非对象、集合类型,参考INCLUDECLASS)字段,用*代替, 如
	 *            *,company.companyName,category.categoryName。默认为 *,
	 *            如果需要数据格式转换，在字段后面加 (:date)表示转换为标准日期
	 *            格式(2012-03-21)，(expName:date) 表示输出字段名为expName,格式为date,
	 *            目前格式转换只支持 date 例:xxx.x(x1),[distinct]yyy.y(y1),*,表示 yyy.y
	 *            修饰符为distinct,输出为y1。
	 * @param dataType
	 *            返回字符串类型 json, xml。默认为 json
	 * @param isGetTotal
	 *            是否获取记录数
	 * @param pNames
	 *            条件名数组
	 * @param pValues
	 *            条件值数组
	 * @param logic
	 *            逻辑 and or 或括号
	 * @param relation
	 *            条件名和值关系数组
	 * @param pageno
	 *            页号
	 * @param pagesize
	 *            页面大小
	 * @param sort
	 *            可以为空。排序条件,该值为数组,第一个为字段名,第二个排序方法(asc或desc),排序方法可以为空,
	 *            默认为asc(升序)。 如 commodityId,categoryId asc,desc。
	 * @return 结果字符串
	 * @throws Exception
	 * 
	 */
	public String findByProperty(String entityName, String fieldStr,
			String dataType, boolean isGetTotal, String[] pNames,
			Object[] pValues, String[] logic, String[] relation,
			Integer pageno, Integer pagesize, String... sort) throws Exception;

	public String findByPropertyList(String entityName, String fieldStr,
			String dataType, boolean isGetTotal, List<String> pNameL,
			List<Object> pValueL, List<String> logicL, List<String> relationL,
			Integer pageno, Integer pagesize, String... sort) throws Exception;

	/**
	 * 获取对象列表
	 * 
	 * @param entityName
	 * @param pNames
	 * @param pValues
	 * @return
	 * @throws Exception
	 */
	public List findByProperty(String entityName, String[] pNames,
			Object[] pValues) throws Exception;

	/**
	 * 批量保存数据
	 * 
	 * @param datas
	 *            {adds:[{model,model}],edits:[{model,model}],removes:[{model,model
	 *            }]}
	 * @return 成功或失败
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	public Boolean batchSave(String entityName, String datas,
			Map<String, Object> extraParams) throws SecurityException,
			NoSuchMethodException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException,
			ClassNotFoundException;

	/**
	 * 批量保存数据
	 * 
	 * @param datas
	 *            json对象{adds:[{model,model}],edits:[{model,model}],removes:[{model
	 *            ,model}]}
	 * @return 成功或失败
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws ClassNotFoundException
	 */
	public Boolean batchSave(String entityName, JSONObject datas,
			Map<String, Object> extraParams) throws SecurityException,
			NoSuchMethodException, IllegalArgumentException,
			IllegalAccessException, InvocationTargetException,
			ClassNotFoundException;

	/**
	 * 添加单条记录
	 * 
	 * @param entityName
	 *            :实体名
	 * @param entity
	 *            :要操作的实体
	 * @return: entity
	 * @throws ClassNotFoundException
	 */
	public Object addRecord(Object entity) throws Exception;

	/**
	 * 编辑单条记录
	 * 
	 * @param entityName
	 *            :实体名
	 * @param entity
	 *            :要操作的实体
	 * @return: entity
	 * @throws ClassNotFoundException
	 */
	public Object editRecord(Object entity) throws Exception;

	/**
	 * 删除单条记录
	 * 
	 * @param entityName
	 *            :实体名
	 * @param entity
	 *            :要操作的实体
	 * @return: entity
	 * @throws ClassNotFoundException
	 */
	public Object delRecord(String entityName, Object id)
			throws ClassNotFoundException;

	/**
	 * 删除单条记录
	 * 
	 * @param entity
	 *            :要操作的实体
	 * @return: entity
	 * @throws ClassNotFoundException
	 */
	public Object delRecord(BasePojo entity) throws ClassNotFoundException;

	/**
	 * 删除单条记录
	 * 
	 * @param entityName
	 *            :实体名
	 * @param id
	 *            :要操作的实体编号
	 * @return: entity
	 * @throws ClassNotFoundException
	 */
	public Object delById(String entityName, Object id)
			throws ClassNotFoundException;

	/**
	 * 删除多条记录
	 * 
	 * @param entityName
	 *            :实体名
	 * @param ids
	 *            :id串
	 * @return: true
	 * @throws ClassNotFoundException
	 */
	public Boolean delByIds(String entityName, String idName, String ids)
			throws ClassNotFoundException;

	/**
	 * 获取单个查询信息结果字符串
	 * 
	 * @param entityName
	 *            实体名(和dao.pojo中定义一样，包含大小写)
	 * @param fieldStr
	 *            要查询的字段,以“,”分隔,基于外键的关系,用对象方式,如company.companyName,
	 *            如果查询所有常规(非对象、集合类型,参考INCLUDECLASS)字段,用*代替, 如
	 *            *,company.companyName,category.categoryName。默认为 *,
	 *            如果需要数据格式转换，在字段后面加 (:date)表示转换为标准日期
	 *            格式(2012-03-21)，(expName:date) 表示输出字段名为expName,格式为date,
	 *            目前格式转换只支持 date 例:xxx.x(x1),[distinct]yyy.y(y1),*,表示 yyy.y
	 *            修饰符为distinct,输出为y1。
	 * @param dataType
	 *            返回字符串类型 json, xml。默认为 json
	 * @param idName
	 *            主键名
	 * @param id
	 *            主键值
	 * @throws Exception
	 * 
	 */
	public String findById(String entityName, String fieldStr, String dataType,
			String idName, Object id) throws Exception;

	/**
	 * 上移
	 * 
	 * @param entityName
	 *            实体名称
	 * @param colName
	 *            列名
	 * @param id
	 *            实体主键值
	 * @param nullException
	 *            实体为空时抛的异常
	 * @throws Exception
	 */
	public void up(String entityName, String colName, Object id,
			String nullException) throws Exception;

	/**
	 * 下移
	 * 
	 * @param entityName
	 *            实体名称
	 * @param colName
	 *            列名
	 * @param id
	 *            实体主键值
	 * @param nullException
	 *            实体为空时抛的异常
	 * @throws Exception
	 */
	public void down(String entityName, String colName, Object id,
			String nullException) throws Exception;

	/**
	 * 置顶
	 * 
	 * @param entityName
	 *            实体名称
	 * @param colName
	 *            列名
	 * @param id
	 *            实体主键值
	 * @param nullException
	 *            实体为空时抛的异常
	 * @throws Exception
	 */
	public void top(String entityName, String colName, Object id,
			String nullException) throws Exception;

	/**
	 * 设置某字段为true
	 * 
	 * @param entityName
	 *            实体名称
	 * @param colName
	 *            列名
	 * @param id
	 *            实体主键值
	 * @param nullException
	 *            实体为空时抛的异常
	 * @throws Exception
	 */
	public void setTrue(String entityName, String colName, Object id,
			String nullException) throws Exception;

	/**
	 * 设置某字段为false
	 * 
	 * @param entityName
	 *            实体名称
	 * @param colName
	 *            列名
	 * @param id
	 *            实体主键值
	 * @param nullException
	 *            实体为空时抛的异常
	 * @throws Exception
	 */
	public void setFalse(String entityName, String colName, Object id,
			String nullException) throws Exception;

}
